"""
@author: xxw
@file: 09.常用的魔术方法.py
@time: 2023/5/18 16:02
"""
# 魔术方法，是不需要显示调用，某种情况下自动执行的方法
# 构造方法（__new__/__init__）
# __new__:创建实例
# __init__:初始化实例方法
# 析构函数 （__del__）
# 在实例释放，销毁的时候自动执行的，通常做一些收尾工作，关闭一些数据库的连接，关闭打开的临时文件
# 调用方法 （__call__）
# 把实例化后的对象当作函数调用的时候自动执行
# class A:
#     def __init__(self):
#         print("this is init")
#     def __del__(self):
#         print("this is del")
#     def __call__(self):
#         print("this is call")
# a = A()  #实例化
# # 先执行__new__方法，生成一个实例对象，然后再执行__init__,初始化这个实例对象
# # 新式类才用__new__方法
# a()
#
# def func1():
#     pass
# print(dir(func1))
#
# ######## __str__  __repr__ #对象的描述信息
#
# class A:
#     def __str__(self):
#         return "this is class A"
# a = A()
# print(a)
# result = str(a)
# print(result)

# raise ValueError
# 自定义异常类
# 输出信息是长度不合法

# __getitem__
# __setitem__
# __delitem__
# 让对象以字典的形式去设置或获取值

# 自省函数
# hasattr(obj, key) 检查obj里面是否有key成员，这个obj可以是class，也可以是模块
# getattr(obj, key) 获取obj里面相应的属性key的值
# setattr(obj, key, value)给obj设置一个key属性，值为value
# delattr(obj, key)删除obj的key属性
class A:
    def __init__(self):
        self.name = None
        self.age = None
        self.sex = None

    def __getitem__(self, key):
        print("get data:")
        return getattr(self, key)
    def __setitem__(self, key, value):
        print("set data:", key, value)
        if hasattr(self, key):
            setattr(self, key, value)
    def __delitem__(self, key):
        print("delete data:", key)
        delattr(self, key)

a = A()
print(a["name"])
a["name"] = "sc"
# print(a["name"])



# class LenError(Exception):
#     def __str__(self):
#         print("长度不合法")
#
# raise LenError

def func1():
    print("this is func1")

def func2():
    print("this is func2")
